﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using middleware.utiles;
using System.IO;
using System.Xml;
using System.Windows.Forms;

namespace middleware.entradaXml
{
    class BandejaEntradaXml : ITipoBandejaEntrada
    {
        private string ruta = "";

        private const string NOMBRE_BANDEJA = "BandejaEntradaXML";

        public int ElementosSinLeer()
        {
            int result = 0;
            if (ruta != null && ruta.CompareTo("") != 0) 
            {                
                if (Directory.Exists(ruta)) 
                {
                    string[] listaXmls = Directory.GetFiles(ruta, "*.xml", SearchOption.TopDirectoryOnly);

                    if (listaXmls != null)
                    {
                        result = listaXmls.Length;
                    }
                    else
                    {
                        result = 0;
                    }
                }
            }
            return result;
        }

        public Mensaje ObtenerMensaje()
        {
            Mensaje result = null;
            if (ruta != null && ruta.CompareTo("") != 0)
            {
                if (Directory.Exists(ruta))
                {
                    string[] listaFicheros = Directory.GetFiles(ruta, "*.xml", SearchOption.TopDirectoryOnly);
                    if (listaFicheros != null && listaFicheros.Length > 0)
                    {
                        result = CargarMensaje(result, listaFicheros[0]);
                    }
                }
            }
            return result;
        }

        private Mensaje CargarMensaje(Mensaje result, string xmlFilePath)
        {
            result = new Mensaje();
            XmlDocument xml = new XmlDocument();
            xml.Load(xmlFilePath);            

            XmlNode nodeMensaje = xml.SelectSingleNode("/mensaje");
            XmlNode nodeAtributos = xml.SelectSingleNode("/mensaje/atributos");

            string titulo = nodeMensaje.Attributes["titulo"].Value;

            XmlNodeList nodeListaAtributos = xml.SelectNodes("/mensaje/atributos/atributo");
            result.fecha = System.DateTime.Now;

            result.titulo = titulo;

            foreach (XmlNode nodeAtributo in nodeListaAtributos)
            {
                Atributo atributo = new Atributo();
                string nombre = nodeAtributo.Attributes["nombre"].Value;
                string tipo = nodeAtributo.Attributes["tipo"].Value;
                string valor = nodeAtributo.Attributes["valor"].Value;
                atributo.nombre = nombre;
                atributo.tipo = tipo;
                atributo.valor = valor;
                result.atributos.Add(atributo);
            }
            return result;
        }

        public void MarcarComoLeido(Mensaje mensaje)
        {
            Mensaje msjComparar = null;
            if (ruta != null && ruta.CompareTo("") != 0)
            {
                if (Directory.Exists(ruta))
                {
                    string[] listaXmls = Directory.GetFiles(ruta, "*.xml", SearchOption.TopDirectoryOnly);
                    if (listaXmls != null && listaXmls.Length > 0)
                    {
                        for (int i = 0; i < listaXmls.Length; i++)
                        {
                            msjComparar = CargarMensaje(msjComparar, listaXmls[i]);
                            if (mensaje.Equals(msjComparar))
                            {
                                File.Delete(listaXmls[i]);
                            }
                        }
                    }
                }
            }
        }

        public string getConfiguracion()
        {
            return ruta;
        }

        public void setConfiguracion(string c)
        {
            ruta = c;
        }

        override
        public string ToString()
        {
            return NOMBRE_BANDEJA;
        }

        public UserControl getVentanaConfiguracion()
        {
            VentanaConfiguracion aRetornar = new VentanaConfiguracion();
            return aRetornar;
        }

        //Procedimiento que recibe una instancia del usercontrol "VentanaConfiguracion"
        //y retorna la configuracion
        public string getConfiguracionFormulario(UserControl uc)
        {
            string aRetornar;
            VentanaConfiguracion uc2 = (VentanaConfiguracion)uc;
            aRetornar = uc2.getConfiguracion();
            return aRetornar;
        }

        public void setConfiguracionFormulario(UserControl uc, string conf)
        {
            VentanaConfiguracion ventana = (VentanaConfiguracion)uc;
            ventana.setConfiguracion(conf);
        }
    }
}
